package cn.demoncat.util.conn;

import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 连接（根类）
 * 
 * @author 延晓磊
 *
 * @since 2019年11月4日
 */
public abstract class Conn implements Closeable{

	// 连接地址
	private final String url;
 
	/**
	 * 创建连接（默认的连接工厂构建调用）
	 * 
	 * @param url		连接地址
	 * @param config	连接配置
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月4日
	 */
    public <C extends ConnPoolConfig<T>, T>Conn(String url, C config) {
		super();
		this.url = url;
	}
    
	 /**
     * 关闭连接
     * 
     * @author 延晓磊
     *
     * @since 2019年11月4日
     */
    public void close() {
    	// 无操作
    }
    
    /**
     * 是否关闭
     * 
     * @return
     * 
     * @author 延晓磊
     *
     * @since 2019年11月4日
     */
    public boolean isClosed() {
    	return false;
    }
	
	/**
	 * 校验连接
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年11月4日
	 */
	protected boolean toValid() throws IOException{
		return true;
	}
	
	/**
     * 校验连接
     * 
     * @return
     * 
     * @author 延晓磊
     *
     * @since 2019年11月4日
     */
    public final boolean isValid() {
		try {
			return toValid();
		} catch (Exception e) {
			// 关闭连接
			close();
			return false;
		}
    }
    
	/**
     * 获取输出流
     * 
     * @return
     * @throws IOException
     * 
     * @author 延晓磊
     *
     * @since 2019年11月4日
     */
    public OutputStream getOutputStream() throws IOException{
    	return null;
    }

    /**
     * 获取输入流
     * 
     * @return
     * @throws IOException
     * 
     * @author 延晓磊
     *
     * @since 2019年11月4日
     */
    public InputStream getInputStream() throws IOException{
    	return null;
    }

    /**
	 * 激活连接
	 * 
	 * @throws Exception
	 *
	 * @author 延晓磊
	 *
	 * @since 2019年11月4日
	 */
	public void activate() throws Exception {
		// 从连接池取出时的操作
	}

	/**
	 * 钝化连接
	 * 
	 * @throws Exception
	 *
	 * @author 延晓磊
	 *
	 * @since 2019年11月4日
	 *
	 */
	public void passivate() throws Exception {
		// 放到连接池时的操作
	}
	
    /**
     * 连接地址
     * 
     * @return
     * 
     * @author 延晓磊
     *
     * @since 2019年11月4日
     */
	public String getUrl() {
		return url;
	}
 
}
